package websocket

import (
	"encoding/json"
	"github.com/gorilla/websocket"
	"log"
	"pro/global"
)

type Websockets struct {
}

type Message struct {
	UserId int `json:"user_id"`
	DistId int `json:"dist_id"`
	//MessageType int    `json:"message_type"` //消息类型：1 文本消息  2  图片消息  3 语音消息
	Cmd     int    `json:"cmd"` //1: 私聊  2： 群聊  3： 系统消息
	Content string `json:"content"`
	//Url         string `json:"url"`
}

func NewWebsocket() *Websockets {
	return &Websockets{}
}

// 读取消息协程
func (w *Websockets) ReadMessage(node global.Node) {
	defer func() {
		node.Conn.Close()
	}()

	for {
		_, message, err := node.Conn.ReadMessage()
		if err != nil {
			log.Println(err)
			//断开websocket连接
			return
		}

		var msg Message

		err = json.Unmarshal(message, &msg)
		if err != nil {
			node.Data <- []byte("消息内容格式错误")
			return
		}

		switch msg.Cmd {
		case 1: //私聊
			//判断对方是否在线
			if n, ok := global.ClientMap[int64(msg.DistId)]; ok {
				n.Data <- message
			} else {
				node.Data <- []byte("对方不在线")
			}

		default:
			node.Data <- []byte("消息类型错误")
		}
		//switch msg.Cmd {
		//case 1: // 私聊
		//	distID := int64(msg.DistId)
		//	// 读操作加读锁
		//	targetNode, exists := global.ClientMap[distID]
		//
		//	if exists {
		//		// 向目标客户端的通道发送消息
		//		select {
		//		case targetNode.Data <- message:
		//			// 消息发送成功
		//		default:
		//			// 通道满了，避免阻塞当前协程
		//			node.Data <- []byte("对方消息缓冲区已满")
		//		}
		//	} else {
		//		node.Data <- []byte("对方不在线")
		//	}
		//}

		//发送消息到MQ，异步存储
		//go func(msgBytes []byte) {
		//	if err := publishToRabbitMQ(msgBytes); err != nil {
		//		// 处理发送到RabbitMQ的错误
		//	}
		//}(messageWithSender)
	}
}

// 发送消息协程
func (w *Websockets) WriteMessage(node global.Node) {
	for {
		select {
		case data, ok := <-node.Data:
			if ok {
				node.Conn.WriteMessage(websocket.TextMessage, data)
			}
		}
	}
}
